/* eslint-disable no-shadow */
import { csGet } from './cookie'
import { strWith } from './string'
import { getUrlParams } from './bom'
import { createAction } from 'redux-actions'
import { delay } from 'underscore'
import store from '../common/store'
import axios from 'axios'
import msg from '../pages/components/msg'
//根据环境，实现跳转
let env = strWith(window.location.hostname, 'stage-')
  ? 'stage-'
  : strWith(window.location.hostname, 'dev-')
    ? 'dev-'
    : ''

//################################################################
let baseURL = 'http://127.0.0.1:82'
//本地环境1
// baseURL = `http://${env}${env === "dev-" ? "jyqd" : "jyhd"}.yimifudao.com${
//   env === "dev-" ? ":8888" : ""
// }`;
//测试环境
//baseURL = `http://${env === "stage-" ? "stage-" : env === "dev-" ? "stage-" : ""}jyhd.yimifudao.com`;

//正式
//baseURL = 'http://jyhd.yimifudao.com';
//###########################################

//根据环境，实现跳转
let host = strWith(window.location.hostname, 'stage-')
  ? 'stage-'
  : strWith(window.location.hostname, 'stage-') >= 0
    ? strWith(window.location.search, 'devapi') >= 0
      ? 'dev-'
      : 'stage-'
    : ''

//用户登录信息丢失时，跳转地址
export const errorUrl = `http://${host}mis.yimifudao.com`

//获取token
let token = getUrlParams('token') || csGet('token') || 'sdsfsdfsdfsdfsdfsd'

/**
 * 判断token是否存在，不存在，提示并跳转
 * @return {boolean}
 */
function hasToken() {
  return (
    !token &&
    !console.log('token丢失，请重新登录！') &&
    delay(() => (window.location.href = errorUrl), 3000)
  )
}

/**
 * ajax
 * @type {AxiosInstance}
 */
export let ajax = axios.create({
  baseURL,
  headers: {
    'Content-Type': 'application/json',
    'X-AUTH-TOKEN': token
  },
  params: {
    token: { token }
  }
})

/**
 * get请求方法
 * @param url 请求地址
 * @param fn 成功的回调
 * @param error 出现错误的回调
 * @returns {Promise<AxiosResponse<any>>}
 */
export function get(
  url = '',
  fn = res => res,
  error = (message, code) =>
    console.log('默认，接口出现错误提示！', message, code) || msg.error(message)
) {
  return ajax
    .get(url)
    .then(res => {
      if (hasToken()) return false
      let { data, code, message, success } = res.data
      if (!code) {
        return fn(res.data)
      } else {
        error(message, code)
      }
      return null
    })
    .catch(err => {
      console.log('默认catch错误！', err)
    })
}

/**
 * post请求方法
 * @param url 请求地址
 * @param params 请求参数
 * @param fn 成功的回调
 * @param error 出现错误的回调
 * @param isBaseUrl 用于不走本地
 * @returns {Promise<AxiosResponse<any>>}
 */
//特定情况下不能走本地API时，如通过服务器获取真实的TOKEN时
//永远不调本地API
let baseURL2 = `http://${
  env === 'stage-' ? 'stage-' : env === 'dev-' ? 'stage-' : ''
}jyhd.yimifudao.com`
export function post(
  url = '',
  params = {},
  fn = res => res,
  error = (message, code) =>
    console.log('默认，接口出现错误提示！', message, code) || msg.error(message),
  isBaseUrl
) {
  //配置
  let config = {
    baseURL: isBaseUrl ? baseURL2 : baseURL
  }
  //返回
  return ajax
    .post(url, params, config)
    .then(res => {
      //判断没有token 直接返回null
      if (hasToken()) return null
      //从得到的数据中取值
      let { data, code, message, success } = res.data
      //判断res的code为非0，时，返回得到的数据
      if (!code) {
        return fn(res.data)
      } else {
        //权限判断
        if (code === 1004 || code === 11001 || code === 11002) {
          !console.log('没有权限！') && delay(() => (window.location.href = errorUrl), 0)
        }
        error(message, code)
      }
      //否则反回null
      return null
    })
    .catch(err => {
      error(err)
    })
}

/**
 * 通过post直接改变readuce里的内容
 * @param ACT
 * @param url
 * @param parms
 * @param meta 携带的额外参数
 * @param fn
 * @param error
 * @returns {Promise<AxiosResponse<any>>}
 * 使用方法
 不用this.props.dispatch(postReduce(ACT.TEST)(post(`/get/userInfo`,{},(data, res) => ({res}))));
 this.props.dispatch(postReduce(ACT.TEST,`/get/userInfo`));
 this.props.dispatch(postReduce(ACT.TEST,`/get/userInfo`,data=>data));
 */
export function postReduce(
  ACT,
  url = '',
  parms = {},
  meta = {},
  fn = res => res,
  error = (message, code) =>
    console.log('默认，接口出现错误提示！', message, code) || msg.error(message)
) {
  return store.dispatch(createAction(ACT, undefined, () => meta)(post(url, parms)))
}
/**
 * 直接把data传入reduce进行反应
 * @param ACT
 * @param data
 * @param meta 携带的额外参数
 * @returns {Promise<AxiosResponse<any>>}
 * 使用方法
 //postReduce(ACT.USER_USERLIST_GET, '/user/userList', this.param(), { mete: '11' })
 */
export function changeReduce(ACT, data, meta = {}) {
  return store.dispatch(createAction(ACT, undefined, () => meta)(data))
}
